package common.constant;

import lombok.Getter;

import java.sql.Time;
import java.util.Arrays;
import java.util.List;

/**
 * 课程节次枚举
 * <p>定义每天的课程时间段，包括节次名称、开始时间和结束时间。</p>
 */
@Getter
public enum SchedulePeriod {
    /** 第1节课 */
    PERIOD_1("第1节", Time.valueOf("08:00:00"), Time.valueOf("08:45:00")),
    /** 第2节课 */
    PERIOD_2("第2节", Time.valueOf("08:50:00"), Time.valueOf("09:35:00")),
    /** 第3节课 */
    PERIOD_3("第3节", Time.valueOf("09:50:00"), Time.valueOf("10:35:00")),
    /** 第4节课 */
    PERIOD_4("第4节", Time.valueOf("10:40:00"), Time.valueOf("11:25:00")),
    /** 第5节课 */
    PERIOD_5("第5节", Time.valueOf("11:30:00"), Time.valueOf("12:15:00")),
    /** 第6节课 */
    PERIOD_6("第6节", Time.valueOf("14:00:00"), Time.valueOf("14:45:00")),
    /** 第7节课 */
    PERIOD_7("第7节", Time.valueOf("14:50:00"), Time.valueOf("15:35:00")),
    /** 第8节课 */
    PERIOD_8("第8节", Time.valueOf("15:50:00"), Time.valueOf("16:35:00")),
    /** 第9节课 */
    PERIOD_9("第9节", Time.valueOf("16:40:00"), Time.valueOf("17:25:00")),
    /** 第10节课 */
    PERIOD_10("第10节", Time.valueOf("19:00:00"), Time.valueOf("19:45:00")),
    /** 第11节课 */
    PERIOD_11("第11节", Time.valueOf("19:50:00"), Time.valueOf("20:35:00")),
    /** 第12节课 */
    PERIOD_12("第12节", Time.valueOf("20:40:00"), Time.valueOf("21:25:00"));

    /** 节次名称 */
    private final String name;
    /** 开始时间 */
    private final Time startTime;
    /** 结束时间 */
    private final Time endTime;

    /**
     * 枚举构造方法
     *
     * @param name 节次名称
     * @param startTime 开始时间
     * @param endTime 结束时间
     */
    SchedulePeriod(String name, Time startTime, Time endTime) {
        this.name = name;
        this.startTime = startTime;
        this.endTime = endTime;
    }

    /**
     * 根据节次号获取枚举
     *
     * @param period 节次号，从1开始
     * @return 对应的 {@link SchedulePeriod}
     * @throws IllegalArgumentException 如果节次号不合法
     */
    public static SchedulePeriod getByPeriod(int period) {
        if (period < 1 || period > values().length) {
            throw new IllegalArgumentException("无效的节次: " + period);
        }
        return values()[period - 1];
    }

    /**
     * 根据时间获取所属节次
     *
     * @param time 时间
     * @return 所属的 {@link SchedulePeriod}，如果不在任何节次范围内则返回 null
     */
    public static SchedulePeriod getByTime(Time time) {
        for (SchedulePeriod period : values()) {
            if (!time.before(period.startTime) && !time.after(period.endTime)) {
                return period;
            }
        }
        return null;
    }

    /**
     * 获取所有节次
     *
     * @return 包含所有节次的列表
     */
    public static List<SchedulePeriod> getAllPeriods() {
        return Arrays.asList(values());
    }
}
